home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / Book Chapters / 05 - User Interaction / KeyConfig / MiniPreferences.c < prev    next >
Text File  |  1995-03-06  |  3KB  |  123 lines

  1.  
  2. /*Preferences file handling*/
  3.  
  4. /*This is a stripped-down preference file handling unit. It assumes that you always want your*/
  5. /*preference file in the Preferences folder, and use resources for storing the information.*/
  6. /*This file works with System 7 only!*/
  7.  
  8. #include "MiniPreferences.h"
  9.  
  10. /* 1) Find the Preferences folder*/
  11. /* 2) Check if the prefs file already exists. If it does, open it and exit. */
  12. /* 3) Create the prefs file and open it.*/
  13.  
  14. Boolean SetPrefFile(Str255 prefsFileName, OSType prefCreator, OSType prefType, short *appFile, short *prefFile)
  15. {
  16.     OSErr error;
  17.     long directoryID;
  18.     short vRefNum;
  19.     FSSpec fileSpec;
  20.     Boolean returnValue = false;
  21.  
  22.     *appFile = CurResFile (); /*spara programmerts resursfilreferens*/
  23.     *prefFile = 0;
  24. /* 1) find the Preference folder*/
  25.     error = FindFolder(kOnSystemDisk, kPreferencesFolderType, true, &vRefNum, &directoryID);
  26. /*Make a file spec to the pref folder*/
  27.     error = FSMakeFSSpec(vRefNum, directoryID, prefsFileName, &fileSpec);
  28.  
  29. /* 2) Check if a prefs file exists. If it does, open it and return it. */
  30.     *prefFile = FSpOpenResFile(&fileSpec, fsRdWrPerm);
  31.     if ( ResError () == noErr )
  32.     {
  33. /* Open succeeded. */
  34.     }
  35.     else
  36.     {
  37.         *prefFile = 0;
  38.  
  39. /* 3) Create prefs file and open it.*/
  40. /*Create the file*/
  41.         error = FSpCreate(&fileSpec, prefCreator, prefType, 0); /*smRoman = 0*/
  42.         if ( error == noErr )
  43.         {
  44. /*Make a resource fork for it*/
  45.             FSpCreateResFile(&fileSpec, prefCreator, prefType, 0); /*smRoman = 0*/
  46.             if ( ResError () != noErr )
  47.             {
  48. /*Error: Couldn't create resource fork*/
  49.             }
  50.             else
  51. /*Open it*/
  52.                 *prefFile = FSpOpenResFile(&fileSpec, fsRdWrPerm);
  53.  
  54.             if ( ResError () == noErr )
  55.                 return true; /* new pref file! */
  56.         } /*Create succeeded*/
  57.         else
  58.         {
  59. /*Error: Failed to create prefsfile*/
  60.         }
  61.     } /*No prefs file existed*/
  62.     return returnValue;
  63. } /*SetPrefFile*/
  64.  
  65.  
  66. /*********** CopyResource ***********/
  67.  
  68. /* Error handling macros for CopyResource. */
  69. /* If error, set back to the previous resource file and return */
  70.  
  71. #define CleanupAndExit  {UseResFile(oldResourceFile);return ResError();}
  72. #define CheckError {if ( ResError()!= noErr) CleanupAndExit}
  73.  
  74. /* CopyResource: Copy a resource from one resfile to another: */
  75. OSErr CopyResource(short fromFile, short toFile, ResType theResType, short id)
  76. {
  77.     short oldResourceFile;
  78.     Handle theResource, theResourceCopy;
  79.     Boolean wasLoaded;
  80.     short theID;
  81.     ResType theType;
  82.     Str255 theName;
  83.     Boolean returnValue = noErr;
  84.  
  85. /*Save the current resource file*/
  86.     oldResourceFile = CurResFile ();
  87.     UseResFile(fromFile);
  88.     CheckError;
  89.  
  90.     SetResLoad(false);
  91.     theResource = Get1Resource(theResType, id);
  92. /*Don't CheckError before doing SetResLoad(true)!!!*/
  93.     SetResLoad(true);
  94.     CheckError;
  95.     if ( theResource != nil )
  96.     {
  97.         wasLoaded = (*theResource == nil);
  98.         LoadResource(theResource);
  99.         CheckError;
  100.         UseResFile(toFile);
  101.         CheckError;
  102.         GetResInfo(theResource, &theID, &theType, theName);
  103.         CheckError;
  104.         theResourceCopy = theResource;
  105.         if ( HandToHand(&theResourceCopy) != noErr )
  106.             CleanupAndExit;
  107.         CheckError;
  108.         AddResource(theResourceCopy, theResType, id, theName);
  109.         CheckError;
  110.         ReleaseResource(theResourceCopy);
  111.         if ( ! wasLoaded )
  112.             ReleaseResource(theResource); /*If it wasn't loaded before, it shouldn't be afterwards.*/
  113.         CheckError;
  114.         returnValue = noErr;
  115.     }
  116. else
  117.     {
  118.         returnValue = resNotFound;
  119.     };
  120.     UseResFile(oldResourceFile);
  121.     return returnValue;
  122. } /*CopyResource*/
  123.